package pe.com.ValoracionVivienda.domain.entities;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "entrenamiento")
public class Entrenamiento implements Serializable {
	private static final long serialVersionUID = 1L;
	
    private Integer id;
    private String nombre;
    private boolean estado;
    private short tipo;
    private Usuario usuarioCreacion;
    private Date fechaCreacion;
    private int cantidadNeuronasEntrada;
    private ArquitecturaRNA arquitecturaRNA;
    private TipoTasacion tipoTasacion;
    private Set<EntrenamientoModelo> modelos;
    private Set<EntrenamientoItemEntrada> itemsCapaEntradaEntrenamiento;
    
    public Entrenamiento() {
    }
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "Id_Entrenamiento")
    public Integer getId() {
        return id;
    }

    public void setId(Integer idEntrenamiento) {
        this.id = idEntrenamiento;
    }

    @Basic(optional = false)
    @Column(name = "Nombre")
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    @Basic(optional = false)
    @Column(name = "Estado")
    public boolean getEstado() {
        return estado;
    }

    public void setEstado(boolean estado) {
        this.estado = estado;
    }

    @JoinColumn(name = "Id_Arquitectura_RNA", referencedColumnName = "Id_Arquitectura_RNA")
    @ManyToOne(optional = false)
    public ArquitecturaRNA getArquitecturaRNA() {
        return arquitecturaRNA;
    }

    public void setArquitecturaRNA(ArquitecturaRNA idArquitecturaRNA) {
        this.arquitecturaRNA = idArquitecturaRNA;
    }

    @JoinColumn(name = "Id_Tipo_Tasacion", referencedColumnName = "Id_Tipo_Tasacion")
    @ManyToOne
    public TipoTasacion getTipoTasacion() {
        return tipoTasacion;
    }

    public void setTipoTasacion(TipoTasacion idTipoTasacion) {
        this.tipoTasacion = idTipoTasacion;
    }

    @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "entrenamiento")
    public Set<EntrenamientoModelo> getModelos() {
        return modelos;
    }

    public void setModelos(Set<EntrenamientoModelo> modelos) {
        this.modelos = modelos;
    }
    
    public void addModelo(EntrenamientoModelo entrenamientoModelo){
    	if (modelos == null)
    		modelos = new HashSet<EntrenamientoModelo>();
    	modelos.add(entrenamientoModelo);
    }
    
    @Basic(optional = false)
    @Column(name = "Tipo")
    public short getTipo() {
        return tipo;
    }

    public void setTipo(short tipo) {
        this.tipo = tipo;
    }
    
    @Basic(optional = false)
    @Column(name = "FechaCreacion")
    @Temporal(TemporalType.TIMESTAMP)
    public Date getFechaCreacion() {
        return fechaCreacion;
    }

    public void setFechaCreacion(Date fechaCreacion) {
        this.fechaCreacion = fechaCreacion;
    }
    
    @Basic(optional = false)
    @Column(name = "CantidadNeuronasEntrada")
    public int getCantidadNeuronasEntrada() {
        return cantidadNeuronasEntrada;
    }

    public void setCantidadNeuronasEntrada(int cantidadNeuronasEntrada) {
        this.cantidadNeuronasEntrada = cantidadNeuronasEntrada;
    }
    
    @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "entrenamiento")
    public Set<EntrenamientoItemEntrada> getItemsCapaEntradaEntrenamiento() {
        return itemsCapaEntradaEntrenamiento;
    }

    public void setItemsCapaEntradaEntrenamiento(Set<EntrenamientoItemEntrada> itemsCapaEntradaEntrenamiento) {
        this.itemsCapaEntradaEntrenamiento = itemsCapaEntradaEntrenamiento;
    }
    
    @JoinColumn(name = "Id_Usuario_Creacion", referencedColumnName = "Id_Usuario")
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    public Usuario getUsuarioCreacion() {
        return usuarioCreacion;
    }

    public void setUsuarioCreacion(Usuario usuarioCreacion) {
        this.usuarioCreacion = usuarioCreacion;
    }
}
